/*
官方文档： https://studygolang.com/static/pkgdoc/pkg/regexp.htm
参考博客： https://www.cnblogs.com/nulige/p/10260149.html
*/
package main

import (
	"fmt"
	"regexp"
)

func test01() {
	str := "$3543tqf"
	reg, err := regexp.Compile("^data:image/(.*?);base64,(.*?)$")
	if err != nil {
		fmt.Println("正则编译错误！", err)
	}
	ok := reg.MatchString(str)
	if ok {
		fmt.Println("找到！")
		// 1) Find返回保管正则表达式re在b中的最左侧的一个匹配结果的[]byte切片。如果没有匹配到，会返回nil。
		fmt.Println("*********(1)********")
		data_1 := reg.Find([]byte("123"))
		fmt.Println(string(data_1))
		fmt.Println(data_1 == nil) // true
		
		// 2) Find返回保管正则表达式re在b中的最左侧的一个匹配结果的字符串。如果没有匹配到，会返回""；
		// 但如果正则表达式成功匹配了一个空字符串，也会返回""。如果需要区分这种情况，请使用FindStringIndex 
		// 或FindStringSubmatch。
		fmt.Println("*********(2)********")
		data_2 := reg.FindString("123")
		fmt.Println(data_2)
		fmt.Println(data_2 == "") // true

		// 3) Find返回一个保管正则表达式re在b中的最左侧的一个匹配结果以及（可能有的）分组匹配的结果的[][]byte切片。
		// 如果没有匹配到，会返回nil。
		fmt.Println("*********(3)********")
		data_3 := reg.FindSubmatch([]byte(str))
		if len(data_3) > 0 {
			for i, s := range data_3 {
				if i > 0 {
					fmt.Printf("%v = %v\n", i, string(s))
				}
			}
		} else {
			fmt.Println("(3) 未找到")
			fmt.Println(data_3 == nil) // true
		}
		
		// 4) Find返回一个保管正则表达式re在b中的最左侧的一个匹配结果以及（可能有的）分组匹配的结果的[]string切片。
		// 如果没有匹配到，会返回nil。
		fmt.Println("*********(4)********")
		data_4 := reg.FindStringSubmatch(str)
		if data_4 != nil && len(data_4) > 0 {
			for i, s := range data_4 {
				if i > 0 {
					fmt.Printf("%v = %v\n", i, s)
				}
			}
		} else {
			fmt.Println("(4) 未找到")
		}
		
		// 5) Find返回保管正则表达式re在b中的所有不重叠的匹配结果的[][]byte切片。如果没有匹配到，会返回nil。
		fmt.Println("*********(5)********")
		data_5 := reg.FindAll([]byte(str), -1)
		if len(data_5) > 0 {
			for i, s := range data_5 {
				if i > 0 {
					fmt.Printf("%v = %v\n", i, string(s))
				}
			}
		} else {
			fmt.Println("(5) 未找到")
			fmt.Println(data_5 == nil) // true
		}

		// 6) Find返回保管正则表达式re在b中的所有不重叠的匹配结果的[][]byte切片。如果没有匹配到，会返回nil。
		fmt.Println("*********(6)********")
		data_6 := reg.FindAllString(str, -1)
		if len(data_6) > 0 {
			for i, s := range data_6 {
				if i > 0 {
					fmt.Printf("%v = %v\n", i, s)
				}
			}
		} else {
			fmt.Println("(6) 未找到")
			fmt.Println(data_6 == nil) // true
		}

		// 2) Find返回一个保管正则表达式re在b中的所有不重叠的匹配结果及其对应的（可能有的）分组匹配的结果的
		// [][]string切片。如果没有匹配到，会返回nil。
		fmt.Println("*********(2)********")
		findStr := reg.FindAllStringSubmatch(str, -1) // 返回匹配到的数组二维，第零个是原始字符串
		fmt.Println(findStr)
		if len(findStr) > 0 {
			for i, s := range findStr[0] {
				if i > 0 {
					fmt.Printf("%v = %v\n", i, s)
				}
			}
		}
	} else {
		fmt.Println("没有找到！")
	}
}

func main() {
	test01()
}
